package jp.co.toshiba.ffsa.action.cstp;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.dto.LoginDto;
import jp.co.toshiba.ffsa.dto.SessionDto;
import jp.co.toshiba.ffsa.entity.Information;
import jp.co.toshiba.ffsa.form.cstp.Cstp101Form;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.cstp.Cstp101Service;

import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ActionMessagesUtil;
import org.seasar.struts.util.MessageResourcesUtil;
import org.seasar.struts.util.RequestUtil;

/**
 * Topページ
 * @author npc
 */
public class Cstp101Action extends CommonAction {

    /** 画面ID */
    public String screenID = "CSTP101";

    /** ActionForm */
    @ActionForm
    @Resource
    protected Cstp101Form cstp101Form;

    /** お知らせリスト */
    public List<Information> informationList;

    public String loginFlag = "";

    /**
     * 初期処理
     * @return 画面遷移先
     */
    @Execute(validator = false)
    public String index() throws Exception{
        try{
            // セッション初期化
            initSession();

            // お知らせ取得
            Cstp101Service cstp101Service = new Cstp101Service();
            informationList = new ArrayList<Information>();
            informationList = cstp101Service.getSubject();

            return "/cstp/cstp101.jsp";
        }catch(Exception e){
            this.errorLogWriter(e, "index", this.screenID);
            throw e;
        }
    }

    /**
     * ログイン処理
     * @return 画面遷移先
     */
    @Execute(validator = true, input="/cstp/cstp101/error")
    public String login() throws Exception{
        String transition = "/cstp/cstp101.jsp"; // 遷移先
        String result = "";
        try{
            // リファラ判定
            if(this.judgeRefferer()){
                // セッションタイムアウト判定
                if(this.judgeSession()){
                    Cstp101Service service = new Cstp101Service();
                    service.setEmailAddress(this.cstp101Form.emailAddress);
                    service.setPassword(this.cstp101Form.password);
                    String loginFlag = service.loginLogic();

                    if(loginFlag != null && !loginFlag.equals("")){
                        boolean transitionFlag = false;
                        String messageID = "";
                        // ログイン出来た場合
                        if(loginFlag.equals("0")){
                            // 返ってきた値が0の場合は限定情報公開資料に遷移
                            this.loginFlag = "1";
                            transition = "/cstp/cstp101.jsp";
                            transitionFlag = true;
                            result = ConstantValue.success;
                        }else if(loginFlag.equals("1")){
                            // 返ってきた値が1の場合はパスワード変更からxヶ月経過しているのでパスワード変更警告画面に遷移
                            this.loginFlag = "2";
                            transition = "/cstp/cstp101.jsp";
                            transitionFlag = true;
                            result = ConstantValue.fail;
                        }else if(loginFlag.equals("2")){
                            // 返ってきた値が2の場合は仮パスワードなので仮パスワード変更画面に遷移
                            transition = "/csas/csas503/";
                            transitionFlag = true;
                            result = ConstantValue.fail;
                        }else if(loginFlag.equals("3")){
                            // 返ってきた値が3の場合はログイン不許可なのでログイン画面に戻る
                            messageID = "cstp101.903";
                            result = ConstantValue.fail;
                        }else if(loginFlag.equals("4")){
                            // 返ってきた値が4の場合は仮ユーザーなのでログイン画面に戻る
                            messageID = "cstp101.902";
                            result = ConstantValue.fail;
                        }else if(loginFlag.equals("5")){
                            // 返ってきた値が5の場合は仮パスワードの有効期限切れなのでログイン画面に戻る
                            messageID = "cstp101.904";
                            result = ConstantValue.fail;
                        }else if(loginFlag.equals("6")){
                            // 返ってきた値が6の場合はロックさらたなのでログイン画面に戻る
                            messageID = "cstp101.905";
                            result = ConstantValue.fail;
                        }
                        // 遷移フラグ
                        if(transitionFlag){
                            // セッション初期化
                            RequestUtil.getRequest().getSession(true).invalidate();
                            LoginDto dto = new LoginDto();
                            dto.setUserID(service.getUserID());
                            dto.setAuthority(service.getAuthority());
                            dto.setAgreementFlag(service.getAgreementFlag());
                            RequestUtil.getRequest().getSession().setAttribute("login_dto", dto);
                            cstp101Form.setAuthority(service.getAuthority());
                            cstp101Form.setAgreementFlag(service.getAgreementFlag());
                            SessionDto sessionDto = new SessionDto();
                            sessionDto.setSessionID(RequestUtil.getRequest().getSession(true).getId());
                            RequestUtil.getRequest().getSession().setAttribute("session_dto", sessionDto);
                            cstp101Form.setSessionId(RequestUtil.getRequest().getSession(true).getId());
                        }else{
                            ActionMessages messages = new ActionMessages();
                            messages.add("loginFailed", new ActionMessage(messageID, true));
                            ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);
                        }
                    }else{
                        // ログイン出来なかった場合
                        ActionMessages messages = new ActionMessages();
                        messages.add("loginFailed", new ActionMessage("cstp101.901", true));
                        ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);

                        // お知らせ取得
                        informationList = new ArrayList<Information>();
                        informationList = service.getSubject();

                        result = ConstantValue.fail;
                        transition = "/cstp/cstp101.jsp";
                    }

                    if(ConstantValue.success.equals(result)){
                        // 操作ログ記述
                        ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                        ArrayList<String> parameterNames = new ArrayList<String>();
                        ArrayList<String> values = new ArrayList<String>();
                        parameterNames.add(MessageResourcesUtil.getMessage("mail_address"));
                        values.add("-");
                        parameterNames.add(MessageResourcesUtil.getMessage("password"));
                        values.add("-");
                        parameters.add(parameterNames);
                        parameters.add(values);
                        this.entryOperationHistory(this.screenID, "login", parameters, result);
                    }
                }else{
                    return this.topTransition;
                }
            }else{
                return this.topTransition;
            }
        }catch(Exception e){
            this.errorLogWriter(e, "login", this.screenID);
            throw e;
        }
        return transition;
    }

    /**
     * ログアウト処理
     * @return 画面遷移先
     */
    @Execute(validator = false)
    public String logout() throws Exception{
        try{
            // リファラ判定
            if(this.judgeRefferer()){
                // セッションタイムアウト判定
                if(this.judgeSession()){
                    this.entryOperationHistory(this.screenID, "logout", null, ConstantValue.success);
                    return "/cstp/cstp101/";
                }else{
                    return this.topTransition;
                }
            }else{
                return this.topTransition;
            }
        }catch(Exception e){
            this.errorLogWriter(e, "logout", this.screenID);
            throw e;
        }
    }

    /**
     * バリデーションエラー処理
     * @return 遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String error() throws Exception{
        // リファラ判定
        if(this.judgeRefferer()){
            // セッションタイムアウト判定
            if(this.judgeSession()){
                return index();
            }else{
                return this.topTransition;
            }
        }else{
            return this.topTransition;
        }
    }

    /*
     * セッション初期化
     */
    private void initSession() {
        RequestUtil.getRequest().getSession(true).invalidate();
        SessionDto dto = new SessionDto();
        dto.setSessionID(RequestUtil.getRequest().getSession(true).getId());
        RequestUtil.getRequest().getSession().setAttribute("session_dto", dto);
        cstp101Form.setSessionId(RequestUtil.getRequest().getSession(true).getId());
    }

    /**
     * パスワード変更後処理
     * @return 画面遷移先
     */
    @Execute(validator = false)
    public String passwordChanged() throws Exception{
        try{
            initSession();
            cstp101Form.message = MessageResourcesUtil.getMessage("cstp101.009");
            return "/cstp/cstp101.jsp";
        }catch(Exception e){
            this.errorLogWriter(e, "passwordChanged", this.screenID);
            throw e;
        }
    }

}